#include<iostream>
#include<mutex>
using namespace std;
//单例模式

// 饿汉模式
// class Singleton{
// private:
//     int data;
// private:
//     static Singleton _eton;//静态对象类内声明
//     //构造函数私有化，避免类外构造
//     Singleton(){
//         data=10;
//     }
// public:
//     static Singleton *GetInstance(){
//         return &_eton;
//     }
//     int get_data(){
//         return data;
//     }
// };
// Singleton Singleton::_eton;//静态对象类外定义

// 懒汉模式
class Singleton{
private:
     int _data;
private:
    static mutex _mutex;
    static Singleton *volatile _eton;//实例化静态对象的指针
    //构造函数私有化，避免类外构造
    Singleton(){
        _data=10;
    }
public:
        static Singleton *volatile GetInstance(){
        if(_eton==NULL){
        _mutex.lock();
        if(_eton==NULL){
            _eton=new Singleton();
        }
        _mutex.unlock();
        }
        return _eton;
     }
     int get_data(){
        return _data;
     }
};
mutex Singleton::_mutex;
Singleton* volatile Singleton::_eton=NULL;
int main(){
    cout<<Singleton::GetInstance()->get_data()<<endl;
    return 0;
}